package br.com.vti.sisp_sicrim.antigo.controller.tela;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;

import br.com.caelum.vraptor.Result;
import br.com.vti.sisp_sicrim.antigo.controller.programa.FuncoesGerais;
import br.com.vti.sisp_sicrim.antigo.controller.programa.Idcpa002;
import br.com.vti.sisp_sicrim.antigo.controller.programa.Idcpm001;
import br.com.vti.sisp_sicrim.antigo.model.DidCadastro;
import br.com.vti.sisp_sicrim.antigo.model.SicTabelas;
import br.com.vti.sisp_sicrim.antigo.model.Sislac01;
import br.com.vti.sisp_sicrim.antigo.util.Sessao;
import br.com.vti.sisp_sicrim.antigo.util.UtilBean;

/**
 * Classe responsavel por encapsular o tratamento e as consistencias da tela
 * Idctaaa2
 * 
 * @author Incode - Data: mai/2014
 * 
 */
public class Idctaaa2 {
	private boolean enviada = false;
	private String pagina = "/resources/antigo/jsp/Idctaaa2.jsp";
	private String versao;
	private String operacao;
	private int dataCorrente;
	private String horaCorrente;
	private String nomeUsuario;
	private long iRegger;
	private long iRegant;
	private String iNomide;
	private String iNommae;
	private int dnas;
	private int mnas;
	private int anas;
	private String chave;
	private int matesp;
	private String empresa;
	private String nomeClasse;
	public String niveis;
	public String nivel;
	private String[][] dedos = new String[6][3];
	private String mensagem = "";
	private String funcao = "0";
	private String campofocus = "dedos[j][i]";
	private String navegar = "";
	private Boolean temMensagem = false;
	private Result result;
	private Sessao sessao;
	private FuncoesGerais funcoes = new FuncoesGerais();
	// Classes views
	DidCadastro did = new DidCadastro();
	SicTabelas vwTabele = new SicTabelas();
	// Classes includes
	Sislac01 sislac01 = new Sislac01();

	public Idctaaa2() {
		inicializar(false);
	}

	public Idctaaa2(boolean primeiraVez, Sessao sessao) {
		this.sessao = sessao;
		inicializar(primeiraVez);
	}

	public void inicializar(boolean primeiraVez) {
		if (primeiraVez) {
			versao = "0";
			operacao = "";
			dataCorrente = 0;
			iRegger = 0;
			iRegant = 0;
			iNomide = "";
			iNommae = "";
			dnas = 0;
			mnas = 0;
			anas = 0;
			chave = "";
			Arrays.fill(dedos, "");
			matesp = 0;
			empresa = "";
			nomeClasse = "";
			empresa = sessao.getSisgsisp().getEmpresa();
			operacao = sessao.getSisgsisp().getOperacao();
			versao = sessao.getSisgsisp().getVersao();
		}
		horaCorrente = new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()); // *TIMX
	}

	public boolean receberTela(boolean primeiraVez, Result result) throws Exception {
		// faz o tratamento das criticas necessarias para os dados da tela
		// recebida
		this.result = result;
		temMensagem = false;
		if (!primeiraVez) {
			return validar();
		} else {
			return true;
		}
	}

	public void enviarTela(boolean primeiraVez, Result result, String origem) {
		this.enviada = true;
		// rotina para enviar a tela
		// caso esteja setado valores para acoesFinais, executa as classes
		// correspondentes
		this.result = result;
		if (UtilBean.acoesFinais != null && !UtilBean.acoesFinais.isEmpty()) {
			UtilBean.processaAcao();
		} else {
			enviar(result, origem);
		}
	}

	public void enviar(Result result, String origem) {
		// redicionar para o jsp correspondente
		UtilBean.redireciona(pagina, result, origem);
	}

	public void enviarMensagem(String campo, String mensagem) {
		// formatar a mensagem de erro, posicionar no campo informa
		if (campo != null) {
			campofocus = campo;
		} else {
			campofocus = "";
		}
		this.mensagem = mensagem;
		temMensagem = true;
		// enviar(result, origem);
	}

	public boolean validar() throws Exception {
		// validar os campos recebidos da tela
		UtilBean.funcao = this.funcao;
		ValidarD01dedos();
		if (temMensagem) {
			return false;
		}
		ValidarDedos();
		if (temMensagem) {
			return false;
		}
		ValidarFuncao();
		if (temMensagem) {
			return false;
		}
		ValidarOperacao();
		if (temMensagem) {
			return false;
		}
		sessao.getSisgsisp().setEmpresa(this.empresa);
		sessao.getSisgsisp().setOperacao(this.operacao);
		sessao.getSisgsisp().setVersao(this.versao);
		return true;
	}

	private void ValidarFuncao() {
		// Consist�ncia F00funcao
		if (!(UtilBean.funcao.equals(UtilBean.ctt_processa) || UtilBean.funcao.equals(UtilBean.ctt_pf2) || UtilBean.funcao.equals(UtilBean.ctt_confirma) || UtilBean.funcao.equals(UtilBean.ctt_retorna) || UtilBean.funcao.equals(UtilBean.ctt_proxima))) {
			enviarMensagem(null, "");
			return;
		}
		if (!UtilBean.funcao.equals(UtilBean.ctt_retorna) && getDedos('*', '*').trim().equals("")) {
			Idcpa002 idcpa002 = new Idcpa002(result, sessao);
			idcpa002.executar(null, null);
		}
		if (UtilBean.funcao.equals(UtilBean.ctt_retorna) && getDedos('*', '*').trim().equals("")) {
			Idcpm001 idcpm001 = new Idcpm001(result, sessao);
			idcpm001.executar(null);
		}
	}

	private void ValidarOperacao() {
		// Consist�ncia F00OPERACAO
		if (!operacao.equals("AFD")) {
			funcoes.sissm001(result, sessao);
		}
	}

	private void ValidarDedos() throws Exception {
		// Consist�ncia F00DEDOS
		Sislac01 sislac01 = new Sislac01();
		String dedo;
		int w = 0;
		int h = 0;
		int s = 0;
		int l = 0;
		int i = 0;
		int j = 0;
		String mensa  ="";
		String senesp ="";
		String maodir ="";
		String maoesq ="";
		int k = 0;
		
		String wUser = UtilBean.getInitUser();
		if (!UtilBean.funcao.equals(UtilBean.ctt_proxima)) {
			if (chave.equals("A")) {
				funcoes.idcsa001(dedos);
				for (i = 1; i <= 2; i++) {
					for (j = 1; j <= 5; j++) {
						dedo = getDedos(j, i);
						if (!UtilBean.subStr(dedo, 0 + 5 - 1, 1).trim().equals("") && !UtilBean.subStr(dedo, 0 + 2 - 1, 1).equals("4")) {
							k += 1;
						}
						if (UtilBean.subStr(dedo, 0 + 2 - 1, 1).equals("4") && UtilBean.subStr(dedo, 0 + 1 - 1, 1).trim().equals("")) {
							w += 1;
						}
						if (!UtilBean.subStr(dedo, 0 + 1 - 1, 1).trim().equals("")) {
							h += 1;
						}
						if (UtilBean.subStr(dedo, 0 + 1 - 1, 1).trim().equals("") && UtilBean.subStr(dedo, 0 + 5 - 1, 1).trim().equals("") && !UtilBean.subStr(dedo, 0 + 2 - 1, 1).trim().equals("")) {
							l += 1;
						}
						if (UtilBean.subStr(dedo, 0 + 2 - 1, 1).equals("2") || UtilBean.subStr(dedo, 0 + 2 - 1, 1).equals("3") && j > 1 && UtilBean.subStr(dedo, 0 + 1 - 1, 1).trim().equals("") && !UtilBean.subStr(dedo, 0 + 5 - 1, 1).trim().equals("")) {
							s += 1;
						}
						if ((k > 2 && w == 0 && h < i) || s > 1) {
							enviarMensagem(null, "ERRO SUBCLASSIFICACAO POSICAO 5");
							return;
						}
					}
				}
				// IF W = 0 && K = 0 && H < 8 && L < 10
				// REINPUT "FALTA INFORMACAO POSICAO 5"
				// MARK 8 ALARM
				for (i = 1; i <= 5; i++) {
					// end-if
					maodir = UtilBean.moveSubstring(maodir, 7*i, 7, "A", getDedos(i, 1));
					maoesq = UtilBean.moveSubstring(maoesq, 7*i, 7, "A", getDedos(i, 2));
				}
				if (!UtilBean.funcao.equals(UtilBean.ctt_proxima)) {
					// Par�grafo: g()
					did.consultaMaoDireitaMaoEsquerda(
							//maodir, 
							getDedos(1, 1), getDedos(2, 1), getDedos(3, 1), getDedos(4, 1), getDedos(5, 1),
							getDedos(1, 2), getDedos(2, 2), getDedos(3, 2), getDedos(4, 2), getDedos(5, 2)
							//maoesq
							);
					if (did.getNomeIdent() != iNomide) {
						if (did.totalRegistros() < 2) {
							mensa = UtilBean.concatena("FORMULA DATILOSCOPICA C/RG:", did.getNumeroRg());
						} else {
							mensa = UtilBean.concatena("FORM.DATILOSC. COM ", did.totalRegistros(), " OCORRENCIAS");
						}
					}
				}
			}
		}
	}

	private void ValidarD01dedos() {
		// Consist�ncia D01DEDOS
	}

	public String getVersao() {
		return versao;
	}

	public void setVersao(String versao) {
		this.versao = versao;
	}

	public String getOperacao() {
		return operacao;
	}

	public void setOperacao(String operacao) {
		this.operacao = operacao;
	}

	public int getDataCorrente() {
		return dataCorrente;
	}

	public void setDataCorrente(int dataCorrente) {
		this.dataCorrente = dataCorrente;
	}

	public String getNomeusuario() {
		return nomeUsuario;
	}

	public void setNomeusuario(String nomeUsuario) {
		this.nomeUsuario = nomeUsuario;
	}

	public long getIregger() {
		return iRegger;
	}

	public void setIregger(long iRegger) {
		this.iRegger = iRegger;
	}

	public long getIregant() {
		return iRegant;
	}

	public void setIregant(long iRegant) {
		this.iRegant = iRegant;
	}

	public String getInomide() {
		return iNomide;
	}

	public void setInomide(String iNomide) {
		this.iNomide = iNomide;
	}

	public String getInommae() {
		return iNommae;
	}

	public void setInommae(String iNommae) {
		this.iNommae = iNommae;
	}

	public int getDnas() {
		return dnas;
	}

	public void setDnas(int dnas) {
		this.dnas = dnas;
	}

	public int getMnas() {
		return mnas;
	}

	public void setMnas(int mnas) {
		this.mnas = mnas;
	}

	public int getAnas() {
		return anas;
	}

	public void setAnas(int anas) {
		this.anas = anas;
	}

	public String getChave() {
		return chave;
	}

	public void setChave(String chave) {
		this.chave = chave;
	}

	public int getMatesp() {
		return matesp;
	}

	public void setMatesp(int matesp) {
		this.matesp = matesp;
	}

	public String getEmpresa() {
		return empresa;
	}

	public void setEmpresa(String empresa) {
		this.empresa = empresa;
	}

	public String getNomeClasse() {
		return nomeClasse;
	}

	public void setNomeClasse(String nomeClasse) {
		this.nomeClasse = nomeClasse;
	}

	public String[][] getDedos() {
		return dedos;
	}

	public void setDedos(String[][] dedos) {
		this.dedos = dedos;
	}

	public String getDedos(int index1, int index2) {
		return dedos[index1][index2];
	}

	public String getDedos(char index1, char index2) {
		String retorno = "";
		loop: for (int i = 1; i <= dedos.length; i++) {
			for (int j = 1; j <= dedos[0].length; j++) {
				if (!dedos[i][j].equals("")) {
					retorno = "valor";
					break loop;
				}
			}
		}

		return retorno;
	}

	public void setDedos(int index1, int index2, String dedos) {
		this.dedos[index1][index2] = dedos;
	}

	// /
	public String getNiveis() {
		return this.nomeUsuario + this.nivel;
	}

	public void setNiveis(String niveis) {
		this.niveis = niveis;
		this.nomeUsuario = UtilBean.subStr(niveis, 0, 30);
		this.nivel = UtilBean.subStr(niveis, 30, 1);
	}

	public String getHoraCorrente() {
		return horaCorrente;
	}

	public void setHoraCorrente(String horaCorrente) {
		this.horaCorrente = horaCorrente;
	}

	public String getFuncao() {
		return funcao;
	}

	public void setFuncao(String funcao) {
		this.funcao = funcao;
	}

	public String getCampofocus() {
		return campofocus;
	}

	public void setCampofocus(String campofocus) {
		this.campofocus = campofocus;
	}

	public String getNavegar() {
		return navegar;
	}

	public void setNavegar(String navegar) {
		this.navegar = navegar;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public void setMensagemSaida(String mensagem) {
		this.mensagem = mensagem;
	}

	public boolean getEnviada() {
		return this.enviada;
	}

	public void setSessao(Sessao sessao) {
		this.sessao = sessao;
	}
}
